function  NPC() {
    this.root = globalJsData.root;
    this.absroot = globalJsData.absroot;
    this.approot = globalJsData.approot;

    this.init();
}

// 初始化方法
NPC.prototype.init =function () {
    // 准备全局layui.layer对象
    window.layer = layui.layer;
    // 准备全局layui.form 对象
    window.layForm = layui.form;
    // 准备全局layui.table对象
    window.layTable = layui.table;
    // 准备权限的layui.laytpl对象
    window.laytpl = layui.laytpl;

    if (window.layuiReady) {
        layuiReady();
    }
    this.addEventListener();

    this.renderItems();
}

// 事件监听
NPC.prototype.addEventListener = function () {

    // text带快捷输入
    $(document).on('click', '.form-text-container.is-quick .form-item-text', function () {
        $('.form-text-container.is-quick').find('.layui-form-select').removeClass('layui-form-selected');
        $(this).siblings('.layui-form-select').addClass('layui-form-selected');
        return false;
    });
    // 拦截所有快捷输入的选择事件 填充数据
    $('.elem-text-options').each(function () {
        var filter = $(this).attr('lay-filter');
        layForm.on('select('+filter+')', function(data){
            $(data.othis).closest('.form-text-container').find('.form-item-text').val(data.value);
        });
    });

    $(document)
    .on('click', '.np-upload-container .file-delete', function () {
        var _this = this;
        var elem = $(this).closest('.np-upload-container').find('.form-item').data('elem');
        layer.confirm('请确认是否删除该文件？', function(index){
            var container = $(_this).closest('.np-upload-container');
                $(_this).closest('.preview-item').remove();
            if (elem == 'image' || elem == 'file') {
                $(container).find('.form-item').val('');
            } else {
                var values = [];
                $(container).find('.file-preview').find('.preview-item.is-upload').each(function () {
                    values.push($(this).data('src'));
                });
                $(container).find('.form-item').val(values.length ?  JSON.stringify(values) : '');
            }
            layer.close(index);
        });
    });
}

// 渲染各种表单类型
NPC.prototype.renderItems = function() {
    if ($('.form-item-datetime,.form-item-date,.form-item-time,.form-item-month,.form-item-year').length) {
        this.renderDate();
    }

    if ($('.np-colorpicker').length) {
        this.renderColor();
    }

    if ($('.np-slider').length) {
        this.renderSlider();
    }

    if ($('.np-transfer').length) {
        this.renderTransfer();
    }

    if ($('.np-rate').length) {
        this.renderRate();
    }

    if ($('.np-upload').length) {
        this.renderUpload();
    }

    if ($('.np-array').length) {
        this.renderArray();
    }

    if ($('.form-item-tinymce').length) {
        this.renderTinymce();
    }

    if ($('.form-item-xmselect').length) {
        this.renderXmselect();
    }

    if ($('.np-tag-container').length) {
        this.renderTag();
    }

    if ($('.form-item-icon').length) {
        this.renderIcon();
    }
}

// 图标选择
NPC.prototype.renderIcon = function() {
    layui.use(['iconPicker'], function () {
        var iconPicker = layui.iconPicker;
        $('.form-item-icon').not('.is-render').addClass('is-render').each(function () {
            iconPicker.render({
                elem: this,
                type: 'fontClass',
                search: $(this).data('search') ? true : false,
                page: $(this).data('page') ? true : false,
                limit: 16
            });
        });
    });
};

// 渲染自定义的类型 array和keyvalue
NPC.prototype.renderArray = function() {
    layui.use(['array'], function () {
        var a = layui.array;
        $('.np-array').not('.is-render').addClass('is-render').each(function () {
            var input = $(this).parent().find('.form-item');
            a.render({
                elem : this,
                type : $(input).data('type') ? $(input).data('type') : 'array',
                value : $(input).val() ? $(input).val() : '',
                change: function (value) {
                    $(this.elem).parent().find('.form-item').val(JSON.stringify(value));
                }
            });
        });
    });
}


// 渲染日期相关
NPC.prototype.renderDate = function () {
    var laydate = layui.laydate;
    $('.form-item-datetime,.form-item-date,.form-item-time,.form-item-month,.form-item-year').not('.is-render').addClass('is-render').each(function () {
        var type = 'date';
        var format = 'yyyy-MM-dd';
        if ($(this).is('.form-item-datetime')) {
            type = 'datetime';
            format = 'yyyy-MM-dd HH:mm:ss';
        } else if ($(this).is('.form-item-month')) {
            type = 'month';
            format = 'yyyy-MM';
        }  else if ($(this).is('.form-item-time')) {
            type = 'time';
            format = 'HH:mm:ss';
        }  else if ($(this).is('.form-item-year')) {
            type = 'year';
            format = 'yyyy';
        }
        var range = false;
        if ($(this).data('range')) {
            range = $(this).data('range') == '1' ? '~' : $(this).data('range');
        }
        if ($(this).data('format')) {
            format = $(this).data('format');
        }
        laydate.render({
            elem: this,
            type : type,
            range : range,
            format : format,
            isPreview : !$(this).data('close-preview') ? true :false,
            min: !$(this).data('min') ? '1900-1-1' : $(this).data('min'),
            max: !$(this).data('max') ? '2099-12-31' : $(this).data('max'),
            trigger :  !$(this).data('trigger') ? 'focus' : $(this).data('trigger'),
            zIndex : !$(this).data('zindex') ? 66666666 : parseInt($(this).data('zindex')),
            showBottom :!$(this).data('hide-bottom') ? true :false,
            btns : !$(this).data('btns') ? ['clear', 'now', 'confirm'] : $(this).data('btns').split(','),
            theme : !$(this).data('theme') ? 'default' :$(this).data('theme'),
            calendar : !$(this).data('calendar') ? false : true,
            mark : !$(this).data('mark') ? false : $(this).data('mark')
        });
    });
}

// 取色器渲染
NPC.prototype.renderColor = function () {
    var colorpicker = layui.colorpicker;
    $('.np-colorpicker').not('.is-render').addClass('is-render').each(function () {
        var input = $(this).parent().find('.form-item');
        colorpicker.render({
            elem: this,
            color : $(input).val(),
            format : $(input).data('format') ? $(input).data('format') : 'hex',
            alpha : $(input).data('alpha') ? true : false,
            predefine : $(input).data('predefine') ? true : false,
            colors : $(input).data('colors') ?  $(input).data('colors').split(',') : undefined,
            done: function(color){
                $(this.elem).closest('.np-colorpicker-container').find('.form-item-color').val(color);
            }
        });
    });
}

// 滑块渲染
NPC.prototype.renderSlider = function () {
    var slider = layui.slider;
    $('.np-slider').not('.is-render').addClass('is-render').each(function () {
        var input = $(this).parent().find('.form-item');
        slider.render({
            elem: this,
            type :$(input).data('type') ? $(input).data('type') : 'default',
            min : $(input).data('min') ? parseFloat($(input).data('min')) : 0,
            max : $(input).data('max') ? parseFloat($(input).data('max')) : 100,
            step : $(input).data('step') ? parseFloat($(input).data('step')) : 1,
            range : $(input).data('range') ? true : false,
            value : $(input).val() ? ($(input).data('range') ? $(input).val().split(',') : $(input).val()) : '',
            showstep : $(input).data('showstep') ? true : false,
            tips : $(input).data('tips') ? true : false,
            input : $(input).data('input') ? true : false,
            height : $(input).data('height') ? parseFloat($(input).data('height')) : 200,
            disabled : $(input).data('disabled') ? true : false,
            theme : $(input).data('theme') ? $(input).data('theme') : '#009688',
            change: function(value){
                if (!this.range) {
                    $(this.elem).parent().find('.form-item').val(value);
                } else {
                    $(this.elem).parent().find('.form-item').val(value.join(','));
                }
            }
        });
    });
}

// 穿梭框渲染
NPC.prototype.renderTransfer = function () {
    var transfer = layui.transfer;
    $('.np-transfer').not('.is-render').addClass('is-render').each(function () {
        var input = $(this).parent().find('.form-item');
        var data = JSON.parse($(this).parent().find('.js-data').html());

        transfer.render({
            elem: this,
            data:data ,
            id: $(input).attr('name'),
            width : $(input).data('width') ? parseInt($(input).data('width')) : 190,
            height : $(input).data('height') ? parseInt($(input).data('height')) : 300,
            title : $(input).data('title') ? $(input).data('title').split(',') : ['数据源','已选中'],
            value : $(input).val() ? $(input).val().split(',') : [],
            showSearch : $(input).data('search') ? true : false,
            onchange: function(){
                var values = [];
                var data = transfer.getData(this.id);
                for (var i in data) {
                    values.push(data[i].value);
                }
                $(this.elem).parent().find('.form-item').val(values.join(','));
            }
        });
    });
}

// 渲染评分
NPC.prototype.renderRate = function () {
    var rate = layui.rate;
    $('.np-rate').not('.is-render').addClass('is-render').each(function () {
        var input = $(this).parent().find('.form-item');
        rate.render({
            elem: this,
            length : $(input).data('length') ? parseInt($(input).data('length')) : 5,
            value : $(input).val() ? parseFloat($(input).val()) : 0,
            theme : $(input).data('theme') ? $(input).data('theme') : '#FFB800',
            half : $(input).data('half') ? true : false,
            text : $(input).data('text') ? true : false,
            readonly : $(input).data('readonly') ? true : false,
            choose: function(value){
                $(this.elem).parent().find('.form-item').val(value);
            }
        });
    });
}

// 渲染上传
NPC.prototype.renderUpload = function () {
    var upload = layui.upload;
    var _this = this;
    $('.np-upload').not('.is-render').addClass('is-render').each(function () {
        var input = $(this).parent().find('.form-item');
        upload.render({
            elem: this,
            url:  $(input).data('url') ? $(input).data('url') :  _this.approot + '/upload/upload',
            field : 'upload',
            data : $(input).data('data') ? $(input).data('data') : undefined,
            exts : $(input).data('exts'),
            auto : $(input).data('auto') ? true : false,
            bindAction : !$(input).data('auto') ? $(this).parent().find('.np-upload-bind') : undefined,
            multiple : $(input).data('multiple'),
            number : parseInt($(input).data('number')),
            size : parseInt($(input).data('size')),
            drag : $(input).data('drag') ? true : false,
            choose: function(obj){
                var files = obj.pushFile();
                this.files = files;
                var elem = $(this.elem).parent().find('.form-item').data('elem');// 类型
                var this_elem = this.elem;

                obj.preview(function(index, file, result){
                    var extension = _this.getExtension(file.name);
                    var thumb = _this.root + 'static/images/fileicon/' + extension + '.png';
                    if (extension && ['jpg', 'png', 'gif', 'jpeg'].indexOf(extension) >=0) {
                        thumb = result;
                    }
                    var error = _this.root + 'static/images/fileicon/file.png';

                    var li = '<li data-fileid="'+index+'" class="preview-item">\n' +
                        '            <div class="thumb"><img src="'+thumb+'" onerror="this.src='+ error +'"></div>\n' +
                        '            <div class="progress"><i style="width: 0;">0%</i></div>\n' +
                        '            <div class="action">\n' +
                        '                <a class="preview-delete"><i class="layui-icon layui-icon-delete"></i></a>\n' +
                        '            </div>\n' +
                        '        </li>';

                    if (elem == 'image' || elem == 'file') {
                        $(this_elem).parent().find('.file-preview').empty().append(li);
                    } else {
                        $(this_elem).parent().find('.file-preview').append(li);
                    }
                    $('[data-fileid="'+index+'"]').find('.preview-delete').click(function () {
                        delete files[index];
                        $(this).closest('.preview-item').remove();
                    });
                });
            },
            progress: function(n, elem, res, index){
                $('[data-fileid="'+index+'"]').find('.progress i').css('width', n + '%').html(n + '%');
            },
            done: function(res, index, upload){
                var elem = $(this.elem).parent().find('.form-item').data('elem');
                if (res.code == 0) {
                    $('[data-fileid="'+index+'"]').addClass('is-upload').find('.msg').remove();
                    $('[data-fileid="'+index+'"]').find('.progress').remove();
                    $('[data-fileid="'+index+'"]').append('<div class="msg">上传成功</div>');
                    $('[data-fileid="'+index+'"]').attr('data-src', res.data.src).find('.action').html('<a class="file-delete"><i class="layui-icon layui-icon-delete"></i></a>');
                    if (elem == 'image' || elem == 'file') {
                        $(this.elem).parent().find('.form-item').val(res.data.src);
                    } else {
                        var files = $(this.elem).parent().find('.form-item').val();
                        files = files ? JSON.parse(files) : [];
                        files.push(res.data.src);
                        $(this.elem).parent().find('.form-item').val(JSON.stringify(files));
                    }
                    delete this.files[index];
                } else {
                    $('[data-fileid="'+index+'"]').append('<div class="msg error">'+res.msg+'</div>');
                    $('[data-fileid="'+index+'"]').find('.msg.error').click(function () {
                        upload();
                    });
                }
            },
            error: function (index, upload) {
                $('[data-fileid="'+index+'"]').append('<div class="msg error">上传失败</div>');
                $('[data-fileid="'+index+'"]').find('.msg.error').click(function () {
                    upload();
                });
            }
        });
    });
    // 拖拽排序
    $('.np-upload-container .file-preview.is-sortable').not('.is-render').addClass('is-render').each(function () {
        new Sortable(this, {
            animation: 150,
            ghostClass: 'blue-background-class',
            onEnd : function (evt) {
                var values = [];
                $(evt.target).find('.preview-item.is-upload').each(function () {
                    values.push($(this).data('src'));
                });
                $(evt.target).closest('.np-upload-container').find('.form-item').val(values.length ?  JSON.stringify(values) : '');
            }
        });
    });
}

// 渲染tinyMCE编辑器
NPC.prototype.renderTinymce = function() {
    layui.use(['tinymce'], function() {
        var tinymce = layui.tinymce;
        $('.form-item-tinymce').not('.is-render').addClass('is-render').each(function () {
            tinymce.render({
                elem: '#' + $(this).attr('id'),
                height: $(this).data('height') ? parseFloat($(this).data('height')) : 360,
                images_upload_url : $(this).data('server') ? $(this).data('server') : ''
            });
        });
    });
}

// 渲染xmselect-下拉单多选
NPC.prototype.renderXmselect = function() {
    layui.use(['select'], function() {
        var select = layui.select;
    });
}

// 渲染tag标签输入
NPC.prototype.renderTag = function() {
    layui.use(['tag'], function () {
        var tag = layui.tag;
        $('.np-tag-container').not('.is-render').addClass('is-render').each(function () {
            var filter = $(this).children('.form-item').attr('name');
            tag.render(filter, {
                skin: 'layui-btn layui-btn-primary layui-btn-sm layui-btn-radius', //标签样式
                tagText: '<i class="layui-icon layui-icon-add-1"></i>添加标签' //标签添加按钮提示文本
            });
            tag.on('add('+filter+')', function(data) {
                var values = [];
                var value = $(data.othis).text();
                var flag = false;
                $(data.elem).find('button').not('.button-new-tag').each(function () {
                    var text = $(this).text();
                    values.push(text);
                    if (text == value) {
                        flag = true;
                        return false;
                    }
                })
                if (flag) {
                    return false;
                }
                values.push(value);
                $(data.elem).parent().find('.form-item').val(values.join(','));
            });

            tag.on('delete('+filter+')', function(data) {
                var values = [];
                var value = $(this).parent().text();
                $(data.elem).find('button').not('.button-new-tag').each(function () {
                    var text = $(this).text();
                    if (text != value) {
                        values.push(text);
                    }
                })
                $(data.elem).parent().find('.form-item').val(values.join(','));
            });
        })
    })
}


NPC.prototype.getExtension = function (file) {
    return file.split('.').pop().toLowerCase();
}



var NP = new NPC();
